package com.linwen.javase.juc;

import java.util.Collections;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @ClassName _19VolatileDemo
 * @Description
 * @Author lin
 * @Date 2022/4/25 上午1:19
 * @Version V1.0
 *
 * volatile 不保证原子性  i++问题
 * i++ 底层分为三步
 * int temp = i;
 * i = i+1;
 * i = temp;
 *
 * 要使用AtomicInteger  jdk提供的包装类
 * 底层使用volatile 保证可见性
 * 使用CAS算法保证原子性
 * CAS：camper and sweap
 * 内存值
 * 原始值
 * 更新值
 * 当且仅当内存值==原始值  更新操作才会进行，否则什么也不做
 */
public class _19VolatileDemo {
    public static void main(String[] args) {


        VolatileTest2 volatileTest2 = new VolatileTest2();
        for (int i = 0; i < 100; i++) {
            new Thread(volatileTest2).start();
        }


    }
}

class VolatileTest2 implements Runnable{
    private volatile int num = 0;
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // System.out.println(num++);
        System.out.println(atomicInteger.getAndIncrement());
    }
}